spring cloud config是spring cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持。
Spring-Cloud-Config
先抛出三个问题:
- 什么是微服务?
- 什么是Spring Cloud?
- 什么是Spring Cloud Config?
对于微服务的理解:
1 | https://www.zhihu.com/question/65502802/answer/802678798 |
Spring Cloud:
Spring Boot
让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud
,它我们提供了一整套的微服务解决方案,大大的降低了微服务开发的门槛,同时也减少了开发成本。Spring Cloud
并不是特指某个框架,它其实是一系列成熟框架的组合,使用的主要技术栈如下(图片是在网上找的,但随着技术的发展,目前有些Spring Cloud指定的技术组件停止了更新,进入了被动维护。但也有新的更好的替代者出现,如配置中心服务,Config是官方推荐组件,Nacos是阿里巴巴开源组件,目前在Spring Cloud孵化器中孵化,孵化成功后,将成为Spring Cloud官方推荐的组件之一,国内成功的案例有阿里,虎牙,爱奇艺等):
Spring Cloud Config:
spring cloud config
是spring cloud
团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持。
CVE-2019-3799
漏洞公告
1 | https://tanzu.vmware.com/security/cve-2019-3799 |
环境搭建
这里分析的版本为:Spring Cloud Config 2.1.1
源码下载地址:
1 | https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.1.1.RELEASE |
在命令行运行:
1 | cd spring-cloud-config-server |
在IDEA中运行:
先Reimport
下maven
依赖,然后运行spring-cloud-config-server
文件下的ConfigServerApplication.java
文件。
访问本地8888端口看是否正常搭建:
漏洞复现
任意文件读取漏洞,尝试读取C:\Windows\win.ini
文件:
1 | http://127.0.0.1:8888/a/b/master/..%252F..%252F..%252F..%252F..%252F..%252FWindows%252Fwin.ini |
漏洞分析
根据Spring Cloud Config手册上的描述:
配置服务器通过
/{name}/{profile}/{label}/{path}
中的附加端点提供这些服务,其中“name”,“profile”和“label”的含义与常规环境端点相同,但“path”是文件名(例如log.xml
)。
首先服务器通过配置文件指定远程的github仓库,然后通过rest接口来读取仓库中的配置文件信息,如读取logtest.yml
文件:
name用来指定名称,profile指定当前策略,label来指定版本,因为logtest.yml
文件并没有名称和策略信息,可随意指定:
通过源码查看对于/{name}/{profile}/{label}
请求的处理逻辑:
获取的参数会传入getFilePath
函数处理,跟进getFIilePath
函数:
经过getFilePath
函数处理,最终获取所需要读取到文件名,接着进入retrieve
函数,跟进retrieve
函数:
通过代码看出,通过函数findOne
来获取最终读取的配置文件(logtest.yml),并返回Resource
接口,跟进findOne
函数:
文件名可控,因此直接构造../
(注意编码)就可进行目录穿越造成任意文件读取。
CVE-2019-3799-补丁
补丁地址:
1 | https://github.com/spring-cloud/spring-cloud-config/commit/3632fc6f64e567286c42c5a2f1b8142bfde505c2 |
在补丁中主要增加了isInvalidPath
和isInvalidEncodedPath
函数,增加了对路径的检测。
isInvalidPath
函数处理逻辑如下:
isInvalidEncodedPath
函数处理逻辑如下:
processPath函数代码如下:
CVE-2020-5405
漏洞的利用有一定的局限性,需要修改配置文件,从本地获取配置文件,不适用于git的情况。
漏洞公告
1 | https://tanzu.vmware.com/security/cve-2020-5405 |
环境搭建
这里分析的版本为:Spring Cloud Config 2.2.0
源码下载地址:
1 | https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.2.0.RELEASE |
下载好源码后需要修改src\main\resources\configserver.yml
文件,将策略改为nativa
,至于为什么修改,接下来将进行分析。
1 | spring: |
配置文档:
1 | https://zq99299.github.io/note-book/spring-cloud-tutorial/config/002.html#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%90%8E%E7%AB%AF |
漏洞复现
任意文件读取漏洞,尝试读取C:\Windows\win.ini
文件:
1 | http://127.0.0.1:8888/a/b/..(_)..(_)..(_)..(_)..(_)..(_)Windows/win.ini |
漏洞分析
CVE-2019-3799的补丁可有效阻止基于path的路径穿越攻击,通过本次的利用方式可以看出,漏洞的触发点并不在path
处,而是在label
处。
通过源码看出,label
参数经过了resolveLabel
函数处理,跟进resolveLabel
函数:
可以看出,如果label
参数中存在(_)
,将会被替换为/
,因label
参数可控,只需要将(_)
通过参数传入,经过代码处理后文件路径边可以控制。
代码默认从git端读取信息,如果采用默认方式,当label
指定版本的不存在时会报500错误,报错信息如下:
通过报错信息可以知道,在经过checkout
函数时存在了异常:
当更改为本地获取配置信息时,如果读取的文件不带后缀,也会报500错误,因此通过/etc/passwd
做漏洞检测时,虽然漏洞存在,但也会报错。
CVE-2020-5405-补丁
补丁地址:
1 | https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0 |
新增了isInvalidEncodedLocation
函数对location
进行了检测,逻辑与对path
检测的逻辑大致相同。
Reference
1 | https://xz.aliyun.com/t/7558 |